home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / dev / c / libiconv_src.lha / src / utf16le.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-07  |  1.3 KB  |  58 lines

  1. /*
  2.  * UTF-16LE
  3.  */
  4.  
  5. /* Specification: RFC 2781 */
  6.  
  7. static int
  8. utf16le_mbtowc (conv_t conv, wchar_t *pwc, const unsigned char *s, int n)
  9. {
  10.   int count = 0;
  11.   if (n >= 2) {
  12.     wchar_t wc = s[0] + (s[1] << 8);
  13.     if (wc >= 0xd800 && wc < 0xdc00) {
  14.       if (n >= 4) {
  15.         wchar_t wc2 = s[2] + (s[3] << 8);
  16.         if (!(wc2 >= 0xdc00 && wc2 < 0xe000))
  17.           return RET_ILSEQ;
  18.         *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00);
  19.         return count+4;
  20.       }
  21.     } else if (wc >= 0xdc00 && wc < 0xe000) {
  22.       return RET_ILSEQ;
  23.     } else {
  24.       *pwc = wc;
  25.       return count+2;
  26.     }
  27.   }
  28.   return RET_TOOFEW(count);
  29. }
  30.  
  31. static int
  32. utf16le_wctomb (conv_t conv, unsigned char *r, wchar_t wc, int n)
  33. {
  34.   if (!(wc >= 0xd800 && wc < 0xe000)) {
  35.     if (wc < 0x10000) {
  36.       if (n >= 2) {
  37.         r[0] = (unsigned char) wc;
  38.         r[1] = (unsigned char) (wc >> 8);
  39.         return 2;
  40.       } else
  41.         return RET_TOOSMALL;
  42.     }
  43.     else if (wc < 0x110000) {
  44.       if (n >= 4) {
  45.         wchar_t wc1 = 0xd800 + ((wc - 0x10000) >> 10);
  46.         wchar_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff);
  47.         r[0] = (unsigned char) wc1;
  48.         r[1] = (unsigned char) (wc1 >> 8);
  49.         r[2] = (unsigned char) wc2;
  50.         r[3] = (unsigned char) (wc2 >> 8);
  51.         return 4;
  52.       } else
  53.         return RET_TOOSMALL;
  54.     }
  55.   }
  56.   return RET_ILSEQ;
  57. }
  58.